{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Embedding 与LSTM实战IMDB文本分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0\n",
      "sys.version_info(major=3, minor=6, micro=10, releaselevel='final', serial=0)\n",
      "matplotlib 3.1.2\n",
      "numpy 1.18.1\n",
      "pandas 0.25.3\n",
      "sklearn 0.22.1\n",
      "tensorflow 2.0.0\n",
      "tensorflow_core.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl,np,pd,sklearn,tf,keras:\n",
    "    print(module.__name__,module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 Physical GPUs, 1 Logical GPUs\n"
     ]
    }
   ],
   "source": [
    "def solve_cudnn_error():\n",
    "    gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "    if gpus:\n",
    "        try:\n",
    "            # Currently, memory growth needs to be the same across GPUs\n",
    "            for gpu in gpus:\n",
    "                tf.config.experimental.set_memory_growth(gpu, True)\n",
    "            logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n",
    "            print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPUs\")\n",
    "        except RuntimeError as e:\n",
    "            # Memory growth must be set before GPUs have been initialized\n",
    "            print(e)\n",
    "\n",
    "solve_cudnn_error()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "imdb = keras.datasets.imdb\n",
    "# 词表大小\n",
    "vocab_size = 10000\n",
    "# 从索引多少时构建\n",
    "index_from = 3\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words = vocab_size, index_from = index_from)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "字符级的model：char-level model即26个字母和9个数字\n",
    "\n",
    "subword-level model\n",
    "\n",
    "eg: \"hello\" -> \"he\" \"ll\" \"o\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88584\n"
     ]
    }
   ],
   "source": [
    "# 载入词表\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "# print(word_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 索引从3开始，所以词表全部偏移3\n",
    "word_index = {k : (v + 3) for k, v in word_index.items()}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 添加必要的特殊字符\n",
    "word_index['<PAD>'] = 0 # padding填充\n",
    "word_index['<START>'] = 1 # 开始\n",
    "word_index['<UNK>'] = 2 # 找不到时填补\n",
    "word_index['<EOS>'] = 3 # 结束\n",
    "\n",
    "# 构建倒排索引：id到词的索引\n",
    "reverse_word_index = dict([(value, key) for key, value in word_index.items()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\""
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看train_data具体文本\n",
    "def decode_review(text_ids):\n",
    "    return ' '.join(\n",
    "        [reverse_word_index.get(word_id, '<UNK>') for word_id in text_ids])\n",
    "\n",
    "decode_review(train_data[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   1   14   22   16   43  530  973 1622 1385   65  458 4468   66 3941\n",
      "    4  173   36  256    5   25  100   43  838  112   50  670    2    9\n",
      "   35  480  284    5  150    4  172  112  167    2  336  385   39    4\n",
      "  172 4536 1111   17  546   38   13  447    4  192   50   16    6  147\n",
      " 2025   19   14   22    4 1920 4613  469    4   22   71   87   12   16\n",
      "   43  530   38   76   15   13 1247    4   22   17  515   17   12   16\n",
      "  626   18    2    5   62  386   12    8  316    8  106    5    4 2223\n",
      " 5244   16  480   66 3785   33    4  130   12   16   38  619    5   25\n",
      "  124   51   36  135   48   25 1415   33    6   22   12  215   28   77\n",
      "   52    5   14  407   16   82    2    8    4  107  117 5952   15  256\n",
      "    4    2    7 3766    5  723   36   71   43  530  476   26  400  317\n",
      "   46    7    4    2 1029   13  104   88    4  381   15  297   98   32\n",
      " 2071   56   26  141    6  194 7486   18    4  226   22   21  134  476\n",
      "   26  480    5  144   30 5535   18   51   36   28  224   92   25  104\n",
      "    4  226   65   16   38 1334   88   12   16  283    5   16 4472  113\n",
      "  103   32   15   16 5345   19  178   32    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0]\n"
     ]
    }
   ],
   "source": [
    "# padding\n",
    "max_length = 500\n",
    "\n",
    "train_data = keras.preprocessing.sequence.pad_sequences(\n",
    "    train_data, value = word_index['<PAD>'], padding = 'post', maxlen = max_length)\n",
    "\n",
    "test_data = keras.preprocessing.sequence.pad_sequences(\n",
    "    test_data, value = word_index['<PAD>'], padding = 'post', maxlen = max_length)\n",
    "\n",
    "print(train_data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 500, 16)           160000    \n",
      "_________________________________________________________________\n",
      "lstm (LSTM)                  (None, 64)                20736     \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 65        \n",
      "=================================================================\n",
      "Total params: 184,961\n",
      "Trainable params: 184,961\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "embedding_dim = 16 # 每个词Embedding成长度为16的向量\n",
    "batch_size = 128\n",
    "\n",
    "single_lstm_model = keras.models.Sequential([\n",
    "    keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),\n",
    "    keras.layers.LSTM(units=64, return_sequences=False),\n",
    "    keras.layers.Dense(64, activation = 'relu'),\n",
    "    keras.layers.Dense(1, activation = 'sigmoid'),\n",
    "])\n",
    "single_lstm_model.summary()\n",
    "single_lstm_model.compile(\n",
    "    optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 20000 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "20000/20000 [==============================] - 15s 750us/sample - loss: 0.6934 - accuracy: 0.5038 - val_loss: 0.6927 - val_accuracy: 0.5180\n",
      "Epoch 2/30\n",
      "20000/20000 [==============================] - 11s 557us/sample - loss: 0.6883 - accuracy: 0.5154 - val_loss: 0.6875 - val_accuracy: 0.5226\n",
      "Epoch 3/30\n",
      "20000/20000 [==============================] - 11s 559us/sample - loss: 0.6781 - accuracy: 0.5317 - val_loss: 0.6901 - val_accuracy: 0.5156\n",
      "Epoch 4/30\n",
      "20000/20000 [==============================] - 11s 559us/sample - loss: 0.6566 - accuracy: 0.5339 - val_loss: 0.6958 - val_accuracy: 0.5188\n",
      "Epoch 5/30\n",
      "20000/20000 [==============================] - 11s 561us/sample - loss: 0.7566 - accuracy: 0.5379 - val_loss: 0.6934 - val_accuracy: 0.5144\n"
     ]
    }
   ],
   "source": [
    "callbacks = [\n",
    "    keras.callbacks.EarlyStopping(patience=3, min_delta=1e-3),\n",
    "]\n",
    "\n",
    "# 训练\n",
    "history_single_lstm = single_lstm_model.fit(\n",
    "    train_data, train_labels, epochs = 30, batch_size = batch_size,\n",
    "    validation_split = 0.2, callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEzCAYAAAD+XEDdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAcpklEQVR4nO3de3Ad5Znn8e8j6chCxviCjTE2FJ4JETdbZSCBhU0QOMtCluCQgsEMywRXGIoaSCZmpgIhN1KZmcpmwlbI1VEIECokFAXxhlAMWQgItiaQECaZEHBwXECwArGNwRdhy7q9+8c5OshCso7tI+lF+n6qTnX32293P37l0u90n6PuSCkhSZLyVDPeBUiSpOEZ1JIkZcygliQpYwa1JEkZM6glScqYQS1JUsZGDOqIuCUiNkbE74ZZHxHx1YhYFxG/jYgTql+mJEmTUyVn1LcBZ+9h/TnAUaXXFcC39r8sSZIEFQR1Sukx4LU9dFkG3J6KngBmRMS8ahUoSdJkVo3PqOcD6wcst5faJEnSfqqrwj5iiLYh70saEVdQvDxOQ0PDiUcccUQVDq/h9PX1UVPj9wVHm+M8+hzj0ecYj421a9e+mlKaszfbVCOo24HDBywvAF4eqmNKqRVoBWhqakrPPfdcFQ6v4bS1tdHS0jLeZUx4jvPoc4xHn2M8NiLij3u7TTXePt0L/E3p29+nAFtTSq9UYb+SJE16I55RR8QPgRZgdkS0A58DCgAppVXA/cD7gXXADmDFaBUrSdJkM2JQp5QuHmF9Aq6qWkWSJKmsGp9RS5LGWXd3N+3t7XR2du7T9tOnT2fNmjVVrmryamhoYMGCBRQKhf3el0EtSRNAe3s706ZN48gjjyRiqD/G2bPt27czbdq0Uahs8kkpsXnzZtrb21m4cOF+78/v4kvSBNDZ2cnBBx+8TyGt6ooIDj744H2+ujGYQS1JE4QhnY9q/iwMakmSMmZQS5LeNnp6esa7hDFnUEuSquKDH/wgJ554Iscddxytra0APPDAA5xwwgk0NzezdOlSADo6OlixYgWLFi1i8eLF3HPPPQAceOCB5X3dfffdXHbZZQBcdtllXHPNNZxxxhlce+21/PKXv+TUU09lyZIlnHrqqfTf5bK3t5d//Md/LO/3a1/7Gj/72c84//zzy/t98MEH+dCHPjQWw1E1futbklQVt9xyC7NmzWLnzp28613vYtmyZfzt3/4tjz32GAsXLuS114oPYvzCF77A9OnTefrppwF4/fXXR9z32rVreeihh6itrWXbtm089thj1NXV8dBDD3H99ddzzz330NraygsvvMCvf/1r6urqeO2115g5cyZXXXUVmzZtYs6cOdx6662sWPH2ui+XQS1JE8znf/IMz768ba+26e3tpba2dtj1xx52EJ/7wHF73MdXv/pVVq9eDcD69etpbW3lve99b/lPlGbNmgXAQw89xJ133lnebubMmSPWd+GFF5br27p1Kx/+8If5wx/+QETQ3d1d3u+VV15JXV3dbse79NJL+f73v8+KFSt4/PHHuf3220c8Xk4MaknSfmtra+Ohhx7i8ccfp7GxkZaWFpqbmxnq4UsppSG/FT2wbfCfNk2dOrU8/5nPfIYzzjiD1atX8+KLL5YfJjLcflesWMEHPvABGhoauPDCC8tB/nbx9qpWkjSikc58h7K/NzzZunUrM2fOpLGxkd///vc88cQT7Nq1i0cffZQXXnihfOl71qxZnHXWWXz961/nK1/5ClC89D1z5kzmzp3LmjVraGpqYvXq1cPWs3XrVubPnw/AbbfdVm4/66yzWLVqFS0tLeVL37NmzeKwww7jsMMO45/+6Z948MEH9/nfOF78Mpkkab+dffbZ9PT0sHjxYj7zmc9wyimnMGfOHFpbW/nQhz5Ec3MzF110EQCf/vSnef311zn++ONpbm7mkUceAeCLX/wi5557LmeeeSbz5s0b9lif+MQn+OQnP8lpp51Gb29vuf3yyy/niCOOYPHixTQ3N/ODH/ygvO6SSy7h8MMP59hjjx2lERg9UXymxtjzedSjz+fLjg3HefQ5xiNbs2YNxxxzzD5vP9FvIXr11VezZMkSPvKRj4zZMYf6mUTEUymlk/ZmP176liRNaCeeeCJTp07lxhtvHO9S9olBLUma0J566qnxLmG/+Bm1JEkZM6glScqYQS1JUsYMakmSMmZQS5KUMYNakjTmBj4pS3tmUEuSJq23w/OtDWpJ0n679tpr+eY3v1levuGGG/j85z/P0qVLOeGEE1i0aBE//vGPK9pXR0fHsNvdfvvt5VuEXnrppQBs2LCB888/n+bmZpqbm/n5z3/Oiy++yPHHH1/e7stf/jI33HADAC0tLVx//fWcfvrp3HTTTfzkJz/h5JNPZsmSJbzvfe9jw4YN5ToGPzf7u9/9LitXrizv9zvf+Q7XXHPNPo9bJbzhiSRNNP92Hfz56b3a5IDeHqjdQyQcugjO+eKwq5cvX87HP/5x/u7v/g6Au+66iwceeICVK1dy0EEH8eqrr3LKKadw3nnnDfmEq4EaGhpYvXr1W7Z79tln+ed//mf+/d//ndmzZ5efb/2xj32M008/ndWrV9Pb20tHR8eIz7jesmULjz76KFB8KMgTTzxBRHDzzTfzpS99iRtvvHHI52bX19ezePFivvSlL1EoFLj11lv59re/vcdj7S+DWpK035YsWcLGjRt5+eWX2bRpEzNnzmTevHmsXLmSxx57jJqaGv70pz+xYcMGDj300D3uK6XE9ddf/5btHn74YS644AJmz54NvPm86Ycffrj8jOna2lqmT58+YlD3PyAEoL29nYsuuohXXnmFrq6u8vOzh3tu9plnnsl9993HMcccQ3d3N4sWLdrL0do7BrUkTTR7OPMdzs4qPJTjggsu4O677+bPf/4zy5cv54477mDTpk089dRTFAoFjjzyyLc8Z3oow2033POmh1JXV0dfX195eU/Pt/7oRz/KNddcw3nnnUdbW1v5Evlwx7v88sv5l3/5F44++mhWrFhRUT37w8+oJUlVsXz5cu68807uvvtuLrjgArZu3cohhxxCoVDgkUce4Y9//GNF+xluu6VLl3LXXXexefNmgPKl76VLl/Ktb30LgN7eXrZt28bcuXPZuHEjmzdvZteuXdx33317PF7/862/973vldv7n5vdr/8s/eSTT2b9+vX84Ac/4OKLL650ePaZQS1JqorjjjuO7du3M3/+fObNm8cll1zCr371K0466STuuOMOjj766Ir2M9x2xx13HJ/61Kc4/fTTaW5uLn+J66abbuKRRx5h0aJFnHjiiTzzzDMUCgU++9nPcvLJJ3Puuefu8dg33HADF154Ie95z3vKl9Vh+OdmA/zVX/0Vp512Wvly+GjyedQTmM/wHRuO8+hzjEfm86jH1rnnnsvKlStZunTpsH2q9Txqz6glSarQli1beOc738kBBxywx5CuJr9MJkkaF08//XT5b6H7TZkyhV/84hfjVNHIZsyYwdq1a8f0mAa1JGlcLFq0iN/85jfjXUb2vPQtSRPEeH3nSG9VzZ+FQS1JE0BDQwOb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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEzCAYAAAD+XEDdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAc60lEQVR4nO3de5hU9Z3n8fe3q6svCCg3RbkIJgyMgqLjLTsZ0qNZ8bKJycbdRY1RMwnrY+7PPhk1M2MmyWwyCTOb2TxjQljHMT5xYnwcN5pIYjKu7WViMowGBbwgEoEGIjcVGmj6Ur/9o0ps2kaqoYo6dL9fz3OeU+ecX5361g/tT51Tp34nUkpIkqRsqqt1AZIkaf8MakmSMsygliQpwwxqSZIyzKCWJCnDDGpJkjLsgEEdEbdFxKaIWL6f7RER34qIVRHxTEScUfkyJUkamso5or4duPBttl8ETCtN84HvHHpZkiQJygjqlNKjwLa3aXIpcEcq+hVwTEQcX6kCJUkayirxHfUEYF2v5bbSOkmSdIjqK7CP6Gddv+OSRsR8iqfHaWpq+oPJkydX4OW1P4VCgbo6rxesNvu5+uzj6rOPD4+VK1duSSmNG8hzKhHUbcCkXssTgQ39NUwpLQIWAUyfPj298MILFXh57U9raystLS21LmPQs5+rzz6uPvv48IiINQN9TiU+Pt0PfKR09fe5wOsppY0V2K8kSUPeAY+oI+IHQAswNiLagC8CeYCU0kJgMXAxsArYBVxbrWIlSRpqDhjUKaXLD7A9AZ+oWEWSJGmvSnxHLUkaArq6umhra6Ojo6PWpWReU1MTEydOJJ/PH/K+DGpJUlna2toYMWIEU6ZMIaK/H/wIIKXE1q1baWtrY+rUqYe8P6/FlySVpaOjgzFjxhjSBxARjBkzpmJnHgxqSVLZDOnyVLKfDGpJ0hFj+PDhtS7hsDOoJUnKMINaknTESSnx+c9/npkzZzJr1ix++MMfArBx40bmzJnD7NmzmTlzJo899hg9PT1cc801e9t+85vfrHH1A+NV35KkI869997L0qVLefrpp9myZQtnnXUWc+bM4Z/+6Z+YO3cuf/Znf0ZPTw+7du1i6dKlrF+/nuXLlwPw2muv1bj6gTGoJUkD9qUfr+DZDdsrus+TTxjJF993SlltH3/8cS6//HJyuRzHHXcc73nPe1iyZAlnnXUWH/3oR+nq6uIDH/gAs2fP5qSTTmL16tV86lOf4pJLLuGCCy6oaN3V5qlvSdIRpzgo5lvNmTOHRx99lAkTJnDVVVdxxx13MGrUKJ5++mlaWlq45ZZb+NjHPnaYqz00HlFLkgas3CPfapkzZw7f/e53ufrqq9m2bRuPPvooCxYsYM2aNUyYMIGPf/zj7Ny5k6eeeoqLL76YhoYGPvShD/GOd7yDa665pqa1D5RBLUk64nzwgx/kiSee4LTTTiMi+MY3vsH48eP53ve+x4IFC8jn8wwfPpw77riD9evXc+2111IoFAD42te+VuPqB8agliQdMdrb24HigCILFixgwYIF+2y/+uqrufrqq9/yvKeeeuqw1FcNfkctSVKGGdSSJGWYQS1JUoYZ1JIkZZhBLUlShhnUkiRlmEEtSVKGGdSSpEHr7e5f/fLLLzNz5szDWM3BMaglScowg1qSdMS44YYb+Pa3v713+S//8i/50pe+xPnnn88ZZ5zBrFmzuO+++wa8346ODq699lpmzZrF6aefzsMPPwzAihUrOPvss5k9ezannnoqL774Ijt37uSSSy7htNNOY+bMmXvvhV0tDiEqSRq4n94Iv1tW2X2OnwUX/fXbNpk3bx6f/exnuf766wG4++67+dnPfsbnPvc5Ro4cyZYtWzj33HN5//vfT0SU/dK33HILAMuWLeP555/nggsuYOXKlSxcuJDPfOYzXHnllXR2dtLT08PixYs54YQTeOCBBwB4/fXXD/INl8cjaknSEeP0009n06ZNbNiwgaeffppRo0Zx/PHH84UvfIFTTz2V9773vaxfv55XXnllQPt9/PHHueqqqwCYMWMGJ554IitXruRd73oXX/3qV/n617/OmjVraG5uZtasWfzLv/wLN9xwA4899hhHH310Nd7qXh5RS5IG7gBHvtV02WWXcc899/C73/2OefPmceedd7J582aefPJJ8vk8U6ZMoaOjY0D73N/9ra+44grOOeccHnjgAebOncutt97Keeedx5NPPsnixYu56aabuOCCC7j55psr8db6ZVBLko4o8+bN4+Mf/zhbtmzhkUce4e677+bYY48ln8/z8MMPs2bNmgHvc86cOdx5552cd955rFy5krVr1zJ9+nRWr17NSSedxKc//WlWr17NM888w4wZMxg9ejQf/vCH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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epochs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history_single_lstm, 'accuracy', 10, 0, 1)\n",
    "plot_learning_curves(history_single_lstm, 'loss', 10, 0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "single_lstm_model.evaluate(test_data, test_labels, batch_size = batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型改进：多层双向LSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_1 (Embedding)      (None, 500, 16)           160000    \n",
      "_________________________________________________________________\n",
      "bidirectional (Bidirectional (None, 500, 128)          41472     \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 128)               98816     \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 64)                8256      \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 1)                 65        \n",
      "=================================================================\n",
      "Total params: 308,609\n",
      "Trainable params: 308,609\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "embedding_dim = 16 # 每个词Embedding成长度为16的向量\n",
    "batch_size = 128\n",
    "\n",
    "lstm_model = keras.models.Sequential([\n",
    "    keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),\n",
    "    keras.layers.Bidirectional(keras.layers.LSTM(units=64, return_sequences=True)),\n",
    "    keras.layers.Bidirectional(keras.layers.LSTM(units=64, return_sequences=False)),\n",
    "    keras.layers.Dense(64, activation = 'relu'),\n",
    "    keras.layers.Dense(1, activation = 'sigmoid'),\n",
    "])\n",
    "lstm_model.summary()\n",
    "lstm_model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 20000 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "20000/20000 [==============================] - 53s 3ms/sample - loss: 0.5952 - accuracy: 0.6576 - val_loss: 0.4380 - val_accuracy: 0.8066\n",
      "Epoch 2/30\n",
      "20000/20000 [==============================] - 46s 2ms/sample - loss: 0.3701 - accuracy: 0.8479 - val_loss: 0.4258 - val_accuracy: 0.8228\n",
      "Epoch 3/30\n",
      "20000/20000 [==============================] - 46s 2ms/sample - loss: 0.4125 - accuracy: 0.8200 - val_loss: 0.5934 - val_accuracy: 0.7184\n",
      "Epoch 4/30\n",
      "20000/20000 [==============================] - 46s 2ms/sample - loss: 0.3705 - accuracy: 0.8443 - val_loss: 0.4216 - val_accuracy: 0.8188\n",
      "Epoch 5/30\n",
      "20000/20000 [==============================] - 46s 2ms/sample - loss: 0.3045 - accuracy: 0.8804 - val_loss: 0.4450 - val_accuracy: 0.8102\n",
      "Epoch 6/30\n",
      "20000/20000 [==============================] - 46s 2ms/sample - loss: 0.3331 - accuracy: 0.8717 - val_loss: 0.4467 - val_accuracy: 0.8076\n",
      "Epoch 7/30\n",
      "20000/20000 [==============================] - 47s 2ms/sample - loss: 0.3901 - accuracy: 0.8348 - val_loss: 0.4627 - val_accuracy: 0.8074\n"
     ]
    }
   ],
   "source": [
    "callbacks = [keras.callbacks.EarlyStopping(patience=3, min_delta=1e-3)]\n",
    "\n",
    "# 训练\n",
    "history_lstm = lstm_model.fit(\n",
    "    train_data, train_labels, epochs = 30, batch_size = batch_size,\n",
    "    validation_split = 0.2, callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Nv3oe2PMfGBx/ZAWERGR5msyqK211caYmTh3c3uAedbadcaYm73rdV1aRESkhfjTo8Za+w7wTr1lDQa0tfb6Uy9LREREQCOTiYiIuJqCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERcTEEtIiLiYgpqERERF1NQi4iIuJiCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERcTEEtIiLiYgpqERERF1NQi4iIuJiCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERcTEEtIiLiYgpqERERF1NQi4iIuJiCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERcTEEtIiLiYgpqERERF1NQi4iIuJiCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERcTEEtIiLiYgpqERERF1NQi4iIuJiCWkRExMUU1CIiIi6moBYREXExBbWIiIiLKahFRERczK+gNsZMMMZsNMZsMcbc1cD6q40x33hfnxpjMgNfqoiISMfTZFAbYzzAk8DFwEDgKmPMwHqbbQPOs9YOBR4A5ga6UBERkY7Inx71mcAWa+1Wa20lsACYVHcDa+2n1tqD3o+fA6mBLVNERKRjCvVjm55Abp3PecDoE2x/I/BuQyuMMTOAGQDJycnk5OT4V6WclNLSUrVxK1A7tzy1cctTG7uXP0FtGlhmG9zQmHE4Qf29htZba+fiPS2ekZFhs7Oz/atSTkpOTg5q45andm55auOWpzZ2L3+COg/oVedzKrC7/kbGmKHAM8DF1trCwJQnIiLSsflzjXo50NcYk26MCQemAm/W3cAYkwa8Dlxjrd0U+DJFREQ6piZ71NbaamPMTOB9wAPMs9auM8bc7F0/B7gXSAT+bowBqLbWjmy5skVERDoGf059Y619B3in3rI5dd5PB6YHtjQRERHRyGQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mIKahERERdTUIuIiLiYglpERMTFFNQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mIKahERERdTUIuIiLiYglpERMTFFNQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mIKahERERdTUIuIiLiYglpERMTFFNQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mIKahERERdTUIuIiLiYglpERMTFFNQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mIKahERERdTUIuIiLiYglpERMTFFNQiIiIupqAWERFxMQW1iIiIiymoRUREXExBLSIi4mJ+BbUxZoIxZqMxZosx5q4G1htjzF+9678xxgwPfKkiIiIdT5NBbYzxAE8CFwMDgauMMQPrbXYx0Nf7mgHMDnCdIiIiHZI/PeozgS3W2q3W2kpgATCp3jaTgBes43MgzhiTEuBaRUREOhx/gronkFvnc553WXO3ERERkWYK9WMb08AyexLbYIyZgXNqHKDCGLPWj++Xk5cE7A92ER2A2rnlqY1bntq4dWQ0dwd/gjoP6FXncyqw+yS2wVo7F5gLYIz5ylo7slnVSrOojVuH2rnlqY1bntq4dRhjvmruPv6c+l4O9DXGpBtjwoGpwJv1tnkTuNZ79/cYoNhau6e5xYiIiMjxmuxRW2urjTEzgfcBDzDPWrvOGHOzd/0c4B3gEmALcBiY1nIli4iIdBz+nPrGWvsOThjXXTanznsL3NrM757bzO2l+dTGrUPt3PLUxi1Pbdw6mt3OxslYERERcSMNISoiIuJiQQnqpoYklVNjjOlljPnIGLPBGLPOGPPLYNfUXhljPMaYVcaYxcGupb0yxsQZY141xnzr/Td9VrBram+MMbO8vyvWGmNeMcZEBrumts4YM88YU1D3MWRjTIIx5gNjzGbvz3h/jtXqQe3nkKRyaqqB/7DWDgDGALeqjVvML4ENwS6inXsceM9a2x/IRO0dUMaYnsAvgJHW2sE4Nw1PDW5V7cJ8YEK9ZXcBH1pr+wIfej83KRg9an+GJJVTYK3dY61d6X1fgvOLTSPFBZgxJhX4AfBMsGtpr4wxXYBzgWcBrLWV1tqi4FbVLoUCnYwxoUBnGhgHQ5rHWrsMOFBv8STgee/754Ef+nOsYAS1hhttRcaYPkAW8EVwK2mXHgN+DdQGu5B27DRgH/Cc9xLDM8aYqGAX1Z5Ya3cBjwA7gT0442D8T3Crare6HR1jxPuzqz87BSOo/RpuVE6dMSYaeA34lbX2ULDraU+MMROBAmvtimDX0s6FAsOB2dbaLKAMP08Xin+810knAelADyDKGPPT4FYldQUjqP0ablROjTEmDCekX7LWvh7setqhs4HLjDHbcS7fnG+MeTG4JbVLeUCetfboGaFXcYJbAucCYJu1dp+1tgp4HRgb5Jraq/yjM0t6fxb4s1MwgtqfIUnlFBhjDM41vQ3W2r8Eu572yFr7G2ttqrW2D86/4aXWWvVCAsxauxfINcYcnchgPLA+iCW1RzuBMcaYzt7fHePRDXst5U3gOu/764A3/NnJr5HJAqmxIUlbu4527mzgGmCNMWa1d9nd3hHmRNqa24CXvH/Yb0VDFAeUtfYLY8yrwEqcJ0ZWoVHKTpkx5hUgG0gyxuQBvwceAhYaY27E+QNpil/H0shkIiIi7qWRyURERFxMQS0iIuJiCmoREREXU1CLiIi4mIJaRETExRTUIiIiLqagFhERcTEFtYiIiIv9fx3WYBGyLtdaAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEzCAYAAAD+XEDdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXhV1b3/8ffKHEhCyAxJmAKEeVImB4ygDKI4K0OR2io/rrNtrUNvbe29naSts1Kv9ToCIuUqKmLFEgUFQZB5HgRCTCBhSoCQkKzfHztgwCAn4ZzsneTzep48J+fsdfb+niXmc9Ye1jbWWkRERMSbgtwuQERERM5MQS0iIuJhCmoREREPU1CLiIh4mIJaRETEwxTUIiIiHnbWoDbGvGyM2WOMWXOG5cYY87QxZosxZpUxpo//yxQREWmcfBlRvwIM/4HlI4AOlT8TgRfOvSwREREBH4LaWvsZsO8HmlwNvGYdi4FYY0wLfxUoIiLSmPnjGHUqsKvK85zK10REROQchfhhHaaa16qdl9QYMxFn9zgRERHntWrVyg+blzOpqKggKEjnCwaa+jnw1MeBpz6uG5s2bSqw1ibW5D3+COocIL3K8zQgt7qG1toXgRcBMjMz7caNG/2weTmT7OxssrKy3C6jwVM/B576OPDUx3XDGLOjpu/xx9en2cAtlWd/DwAOWmu/9cN6RUREGr2zjqiNMdOALCDBGJMD/AYIBbDWTgHmAFcAW4AjwK2BKlZERKSxOWtQW2vHnGW5Be70W0UiIiJykj+OUYuISCNQVlZGTk4OJSUlbpfieREREaSlpREaGnrO61JQi4iIT3JycoiOjqZNmzYYU90FPwJgraWwsJCcnBzatm17zuvTufgiIuKTkpIS4uPjFdJnYYwhPj7eb3seFNQiIuIzhbRv/NlPCmoREak3oqKi3C6hzimoRUREPExBLSIi9Y61lgceeIBu3brRvXt33nrrLQC+/fZbBg0aRK9evejWrRsLFiygvLycH//4xyfbPvHEEy5XXzM661tEROqdWbNmsWLFClauXElBQQF9+/Zl0KBBTJ06lWHDhvGrX/2K8vJyjhw5wooVK9i9ezdr1qwB4MCBAy5XXzMKahERqbHH3lvLutxDfl1nl5Yx/Oaqrj61XbhwIWPGjCE4OJjk5GQuueQSli5dSt++ffnJT35CWVkZ11xzDb169aJdu3Zs27aNu+++m5EjRzJ06FC/1h1o2vUtIiL1jjMp5vcNGjSIzz77jNTUVMaPH89rr71G8+bNWblyJVlZWTz33HPcdtttdVztudGIWkREaszXkW+gDBo0iL///e9MmDCBffv28dlnnzF58mR27NhBamoqt99+O4cPH2b58uVcccUVhIWFcf3115ORkcGPf/xjV2uvKQW1iIjUO9deey2LFi2iZ8+eGGN4/PHHSUlJ4dVXX2Xy5MmEhoYSFRXFa6+9xu7du7n11lupqKgA4I9//KPL1deMglpEROqN4uJiwJlQZPLkyUyePPmU5RMmTGDChAnfe9/y5cvrpL5A0DFqERERD1NQi4iIeJiCWkRExMMU1CIiIh6moBYREfEwBbWIiIiHKahFREQ8TEEtIiIN1g/dv/qbb76hW7dudVhN7SioRUREPExBLSIi9caDDz7I888/f/L5b3/7Wx577DGGDBlCnz596N69O++++26N11tSUsKtt95K9+7d6d27N/Pnzwdg7dq19OvXj169etGjRw82b97M4cOHGTlyJD179qRbt24n74UdKJpCVEREau7DhyBvtX/XmdIdRvzpB5uMHj2a++67jzvuuAOAGTNmMHfuXO6//35iYmIoKChgwIABjBo1CmOMz5t+7rnnAFi9ejUbNmxg6NChbNq0iSlTpnDvvfcybtw4SktLKS8vZ86cObRs2ZIPPvgAgIMHD9byA/tGI2oREak3evfuzZ49e8jNzWXlypU0b96cFi1a8Mgjj9CjRw8uu+wydu/eTX5+fo3Wu3DhQsaPHw9Ap06daN26NZs2bWLgwIH84Q9/4M9//jM7duwgMjKS7t27M2/ePB588EEWLFhAs2bNAvFRT9KIWkREau4sI99AuuGGG5g5cyZ5eXmMHj2aN998k71797Js2TJCQ0Np06YNJSUlNVrnme5vPXbsWPr3788HH3zAsGHDeOmllxg8eDDLli1jzpw5PPzwwwwdOpRHH33UHx+tWgpqERGpV0aPHs3tt99OQUEBn376KTNmzCApKYnQ0FDmz5/Pjh07arzOQYMG8eabbzJ48GA2bdrEzp07yczMZNu2bbRr14577rmHbdu2sWrVKjp16kRcXBw/+tGPiIqK4pVXXvH/h6xCQS0iIvVK165dKSoqIjU1lRYtWjBu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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history_lstm, 'accuracy', 10, 0, 1)\n",
    "plot_learning_curves(history_lstm, 'loss', 10, 0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "lstm_model.evaluate(test_data, test_labels, batch_size = batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型改进：单层双向LSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_2\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_2 (Embedding)      (None, 500, 16)           160000    \n",
      "_________________________________________________________________\n",
      "bidirectional_2 (Bidirection (None, 64)                12544     \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 32)                2080      \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 1)                 33        \n",
      "=================================================================\n",
      "Total params: 174,657\n",
      "Trainable params: 174,657\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "embedding_dim = 16 # 每个词Embedding成长度为16的向量\n",
    "batch_size = 128\n",
    "\n",
    "bi_lstm_model = keras.models.Sequential([\n",
    "    keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),\n",
    "    keras.layers.Bidirectional(keras.layers.LSTM(units=32, return_sequences=False)),\n",
    "    keras.layers.Dense(32, activation = 'relu'),\n",
    "    keras.layers.Dense(1, activation = 'sigmoid'),\n",
    "])\n",
    "bi_lstm_model.summary()\n",
    "bi_lstm_model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 20000 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "20000/20000 [==============================] - 17s 872us/sample - loss: 0.5780 - accuracy: 0.6787 - val_loss: 0.3567 - val_accuracy: 0.8490\n",
      "Epoch 2/30\n",
      "20000/20000 [==============================] - 14s 677us/sample - loss: 0.2703 - accuracy: 0.8938 - val_loss: 0.3072 - val_accuracy: 0.8784\n",
      "Epoch 3/30\n",
      "20000/20000 [==============================] - 14s 676us/sample - loss: 0.1877 - accuracy: 0.9317 - val_loss: 0.3496 - val_accuracy: 0.8788\n",
      "Epoch 4/30\n",
      "20000/20000 [==============================] - 14s 677us/sample - loss: 0.1539 - accuracy: 0.9462 - val_loss: 0.3346 - val_accuracy: 0.8800\n",
      "Epoch 5/30\n",
      "20000/20000 [==============================] - 13s 673us/sample - loss: 0.1175 - accuracy: 0.9615 - val_loss: 0.3753 - val_accuracy: 0.8714\n"
     ]
    }
   ],
   "source": [
    "callbacks = [keras.callbacks.EarlyStopping(patience=3, min_delta=1e-3)]\n",
    "\n",
    "# 训练\n",
    "history_bi_lstm = bi_lstm_model.fit(\n",
    "    train_data, train_labels, epochs = 30, batch_size = batch_size,\n",
    "    validation_split = 0.2, callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEzCAYAAAD+XEDdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3hV1Z3/8c+XXAiBALlBIUFAxchF7gLajkZpLbYq1mLBWy2PSh3FC52Z6tiLzGj7OI5adbRQahWtF+oPpWOt1Yo20p8Vf4KggCgiF4kg5AYkQO7r98c5hBAScgLnZK/kvF/Pkydn77P2Pt8sePLJWvucvcw5JwAA4KcuQRcAAABaRlADAOAxghoAAI8R1AAAeIygBgDAYwQ1AAAeazWozexxM9tlZmtbeN7M7GEz22hmH5rZ2OiXCQBAfIpkRL1Q0pSjPH++pCHhr1mS5h1/WQAAQIogqJ1zyySVHqXJVElPuZDlknqbWb9oFQgAQDyLxjXqHEnbGm0XhvcBAIDjlBiFc1gz+5q9L6mZzVJoelwpKSnjTjjhhCi8PFpSX1+vLl14v2Cs0c+xRx/HHn3cPjZs2FDsnMtuyzHRCOpCSQMabedK2t5cQ+fcAkkLJCkvL8998sknUXh5tKSgoED5+flBl9Hp0c+xRx/HHn3cPsxsa1uPicafTy9J+n743d+TJO1xzu2IwnkBAIh7rY6ozew5SfmSssysUNKdkpIkyTk3X9Irkr4laaOk/ZJmxqpYAADiTatB7Zy7rJXnnaQbo1YRAABoEI1r1ACAgNXU1KiwsFCVlZXHdHyvXr20fv36KFcVv1JSUpSbm6ukpKTjPhdBDQCdQGFhodLS0jRo0CCZNfdhnKMrLy9XWlpaDCqLP845lZSUqLCwUIMHDz7u8/FefADoBCorK5WZmXlMIY3oMjNlZmYe8+xGUwQ1AHQShLQ/ovlvwdQ30EZ19U4l+6pUVB762l5RH3RJADoxghpQ6JrS3gO1Kqqo1K7yQyFcVHHocXFFtYrKq1S6r0r1je69d+GJSbo8uNKBuFJbW6vExPiKrvj6aRF3DlTXhQO38lD4llepKBy6RRVVKg7vq647cmSclGDK7tFV2WldldM7RaMH9GrYPvhV+PEHAfxkgH8uvvhibdu2TZWVlbrllls0a9Ysvfrqq7rjjjtUV1enrKwsvfHGG6qoqNBNN92kFStWyMx055136rvf/a569OihiooKSdLixYv18ssva+HChfrBD36gjIwMrVq1SmPHjtX06dN166236sCBA+rWrZueeOIJ5eXlqa6uTrfddptee+01mZmuu+46DRs2TI888oiWLFkiSXr99dc1b948vfjii0F2VZsQ1OhwaurqVRIO2uKKI0e+jbcrqmqPON5MyuyerKxw4J6U3T0Uuo0DOPy4V7ekVq81lW/muiAgSY8//rgyMjJ04MABnX766Zo6daquu+46LVu2TIMHD1ZpaWghxrvuuku9evXSmjVrJEllZWWtnnvDhg1aunSpEhIStHfvXi1btkyJiYlaunSp7rjjDr3wwgtasGCBNm/erFWrVikxMVGlpaVKT0/XjTfeqKKiImVnZ+uJJ57QzJkd675cBDW8UF/vtPtAzaHgbWbq+eB26b7qZs+RlpLYELLD+/dsCN2DgZzdo6v6pHVVRvdkJSbwPkp0Xv/xp3X6aPveNh1TV1enhISEFp8f1r+n7rxw+FHP8fDDDzeMXLdt26YFCxborLPOaviIUkZGhiRp6dKlWrRoUcNx6enprdZ36aWXNtS3Z88eXX311fr0009lZqqpqWk47/XXX98wNX7w9a666io9/fTTmjlzpt555x099dRTrb6eTwhqxExVbZ1K91WruLxaxRVV4a9qlYQfl+wLjYpL9lWrdF+16uqPXHQtObGL+oQD94TMVI0blH7E1PPB7ZSkln/JAIitgoICLV26VO+8845SU1OVn5+vUaNGqbnFl5xzzc5UNd7X9KNN3bt3b3j8s5/9TOecc46WLFmiLVu2NCwm0tJ5Z86cqQsvvFApKSm69NJLO9w17o5VLQLlnFNFVe1hYVtcEQrhkibfiyuqtLfyyGlnSUpJ6qKsHqGRbm56N40e0FuZPUJT0ZnhUe/BEE7rmshHToA2am3k25zjveHJnj17lJ6ertTUVH388cdavny5qqqq9NZbb2nz5s0NU98ZGRk677zz9Mgjj+jBBx+UFJr6Tk9PV9++fbV+/Xrl5eVpyZIlLdazZ88e5eTkSJIWLlzYsP+8887T/PnzlZ+f3zD1nZGRof79+6t///66++679frrrx/zzxgUgjrO1dU7le1vGrIHtxuPgEP7qmqb/yhS79SkUNB2T9bQ/j2V1f1Q8Gb1SFZmj9DIN7NHsrp35b8d0NlMmTJF8+fP18iRI5WXl6dJkyYpOztbCxYs0CWXXKL6+nr16dNHr7/+un7605/qxhtv1IgRI5SQkKA777xTl1xyie655x5dcMEFGjBggEaMGNHwxrKmfvzjH+vqq6/WAw88oHPPPbdh/7XXXqsNGzZo5MiRSkpK0nXXXafZs2dLkq644goVFRVp2LBh7dIf0WShNTXaH+tRx1ZVbZ2e+3OBTsgbEZp63lel4vJqlewLj4TDj0v3VauZGWcldrHDRrlZ4cdZPZKV2b2rstIO7cvonqykOL7myzq+sUcft279+vUaOnToMR/f2W8hOnv2bI0ZM0bXXHNNu71mc/8mZrbSOTe+LedhaNNJlO6r1sqtZVqxtVQrt5Tpwy/2qLq2XnpnRUOb7skJykoLjXoHZqZq7MB0ZYdHu1nh0e7BMI7k3c4A0BGMGzdO3bt31/333x90KceEoO6AnHPaXLxPK7aWaeWWUDh/VrRPUuhzvyNyeunqMwYquXy7vvHV8Q0fReqWzJutAMSflStXBl3CcSGoO4Cq2jqt/WKvVm4t1XtbyvT+1jKVhD+i1KtbksYPTNd3x+Vq/MAMjczt1fDu54KCXRo9oHeQpQMAjhNB7aGyhmnsMq3cWqoPCsPT2JIGZaYqP6+Pxg9K1/iB6Topu4e6dGGKGgA6K4I6YM45bSnZrxVbShvCeeOu0DsdkxJMw/v30vcnDdT4QekaNzBD2WldA64YANCeCOp2Vl1brzVf7NHKraVasaVM739epuKK0DR2z5REjRuYru+MydH4gekaNaA3N/EAgDhHUMfY7v2NprG3lOmDwt0Nn0UemJmqs07J1viBGRo/KF0nM40NAGiCoI4i55y2luzXiq1lWrGl9LBp7MQupuE5vXTlpIEaPzBd4walq09aSsAVA0AwGq+UhaMjqI9DdW291m7f0/ARqZVbD5/GHhuexh43MF2jcnvz8SgA8ExHWN/a7+o8s2d/jVZ+Hrq2vGJrmT7Ydmga+4SMVJ01JFvjBqVr/MAMDenDNDaA+HHbbbdp4MCBuuGGGyRJc+fOlZlp2bJlKisrU01Nje6++25NnTq11XNVVFRo6tSpzR731FNP6b777pOZaeTIkfr973+vnTt36vrrr9emTZskSfPmzVP//v11wQUXaO3atZKk++67TxUVFZo7d67y8/N15pln6u2339ZFF12kU045RXfffbeqq6uVmZmpZ555Rn379m123ezdu3dr7dq1+tWvfiVJ+u1vf6v169frgQceiEW3SiKoI1JZU6dZv1+pZRuKJIWnsfv31BUTBzZ8TKpPT6axAXjiL7dLX65p0yHd6mqlhKNEwldOk86/p8WnZ8yYoVtvvbUhqJ9//nm9+uqrmjNnjnr27Kni4mJNmjRJF110Uat3PUxJSdGSJUuOOO6jjz7SL37xC7399tvKyspqWN/65ptv1tlnn60lS5aorq5OFRUVra5xvXv3br311luSQouCLF++XGamxx57TPfee6/uv//+ZtfNTk5O1siRI3XvvfcqKSlJTzzxhH7zm98c9bWOF0Edgf98+SMt21CkG/JP0j8NydboAUxjA0BjY8aM0a5du7R9+3YVFRUpPT1d/fr105w5c7Rs2TJ16dJFX3zxhXbu3KmvfOUrRz2Xc0533HHHEce9+eabmjZtmrKysiQdWm/6zTffbFhjOiEhQb169Wo1qKdPn97wuLCwUNOnT9eOHTtUXV3dsH52S+tmn3vuuXr55Zc1dOhQ1dTU6LTTTmtjb7UNQd2KJasK9ey7n+uHZ5+oH085NehyAKB1Rxn5tuRAFBblmDZtmhYvXqwvv/xSM2bM0DPPPKOioiKtXLlSSUlJGjRo0BHrTDenpeNaWm+6OYmJiaqvP7Ta39HWt77pppv0ox/9SBdddJEKCgo0d+5cSS2vb33ttdfql7/8pU499VTNnDkzonqOR/wueRSBDTvLdceLazVhUIb+7by8oMvxl3NSfb1UVyvVVku1VVLNAal6n1RVLlXukQ6USftLpX0lUkWRVL5T2rtD2vOFtHubVLZVKtsSenygLHQuAB3KjBkztGjRIi1evFjTpk3Tnj171KdPHyUlJelvf/ubtm7dGtF5Wjpu8uTJev7551VSUiJJDVPfkydP1rx58yRJdXV12rt3r/r27atdu3appKREVVVVevnll4/6egfXt37yyScb9h9cN/ugg6P0iRMnatu2bXr22Wd12WWXRdo9x4wRdQv2Vdbozqde1TeTNuquk7soccljodBReE1I5yJ8rNB24+VEG+9v8/Eu4uPHl1dI67tLrr6Fr/C5mntOrkm75o5t1DYWErtJXdOkrj2k5B5S156hx13Twtvhfck9GrVLa3JMeDshKTY1Amgw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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history_bi_lstm, 'accuracy', 10, 0, 1)\n",
    "plot_learning_curves(history_bi_lstm, 'loss', 10, 0, 1.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "bi_lstm_model.evaluate(test_data, test_labels, batch_size = batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
